APIキーなどのあらゆる文字列を1Passwordで管理してCLIから利用する
各種APIや、Webサービスにログインして、 情報を取得するような細々したコマンドラインツールをよく作ります。 このとき、APIキーや認証情報をどこに保存するかが悩みの種でした。
AWSだったらSSMパラメータストアのSecureStringを利用したり、 SecretsManagerに格納して、 そこから呼び出して使うようにします。 それらの場所は適切な権限がなければその文字列を見れないようになっています。
それと同じことをローカルマシンでも実現するにはどうしたらいいんだろう? と考えてみると、 1Passwordこそがそのための場所だと気づきました。 1Passwordは他のアプリとの連携も色々できるようなので少し調べてみたところ、 簡単に実演する事ができました。
やり方の概要
- 1Password CLIのインストール
- 秘匿情報を1Passwordに登録する
.env
ファイルを準備する- 1Passwordを経由してコマンドを実行する
1Password CLIのインストール
1Passwordのコマンドラインツールをインストールします。 公式サイトからインストール方法を確認してください。
Get started with 1Password CLI | 1Password Developer
Step 2: Turn on the 1Password desktop app integration
の操作も合わせて行わないと機能しませんので、注意してください。
秘匿情報を1Passwordに登録する
1Passwordに情報を登録します。
例えばAPIキーなら、「API 認証情報」に
こんな感じで登録します。
少なくとも名前(ここでは「OpenAI」)と認証情報だけ入力すればOKです。
他にも、ヘッダレスChromeでWebサイトにアクセスして情報を取得するようなRPAツールであれば、 普段ログインに使っているユーザ名、パスワードの情報がそのまま使えます。
.env
ファイルを準備する
.env
ファイルは、環境変数などを定義しておくファイルです。
今回の用途に限れば名前や配置場所は全く自由なので、
好きな場所に好きな名前で配置すればOKです。
中身は以下のようにします。
OPEN_AI_API="op://Employee/OpenAI/credential" KOT_USER_ID="op://Employee/KoT/login_id" KOT_PASSWORD="op://Employee/KoT/login_password"
秘匿情報をあらわに書く必要はなく、 1Passwordから情報を取得するという呪文を書いておくイメージです。
呪文の書き方については、
のように、取得したい情報のプルダウンから「秘密参照をコピーする」をクリックすると
"op://Employee/OpenAI/credential"
という文字列がクリップボードにコピーされますので、それを貼り付けます。
なお、シェルスクリプト的には、=
の右辺は"
括りなのでただの文字列です。
当然このファイルを普通に実行した場合はop
始まりの文字列が格納されるだけです。
1Passwordを経由してコマンドを実行する
以上で準備は完了です。 コマンドラインで実行するときに、下記のように1Passwordを経由して実行します。
op run --env-file="$HOME/.env" -- python sample.py
先述のように、ここでenv-fileのフルパスを渡せるので、
.env
ファイルの場所はどこでも大丈夫です。
Pythonスクリプト内では、環境変数として秘匿情報を取得するように記述してあります。
OPEN_AI_API = os.environ["OPEN_AI_API"]
この部分に1Passwordから取得した文字列が格納されることになります。
実行してみる
先ほどのコマンド
op run --env-file="$HOME/.env" -- python sample.py
をターミナルから実行してみます。
Macの場合、下記のようなアクセス認証画面が出ます。
Touch IDも利用できますのでスマートに認証できます。
環境変数が1Passwordから渡された値になり、プログラムが正常に動作するはずです。
まとめ
秘匿したい情報を1Passwordに管理させて、 外に出さないで利用する事ができました!
この方法を使えば、APIキーに限らず、 1Passwordで管理させたい文字列なら何でも同様のインターフェイスで利用する事ができます。
秘匿情報は1Passwordだけに保存! それ以外の場所にあらわに書かない! クリップボードも経由しない! 指紋も使える!
これは捗りますね。
余談
以下のように、 実行するコマンドの中で当該の環境変数をプリントしようとしてもマスクされて表示されます!
$ op run --env-file="$HOME/.env" -- env | grep 'OPEN_AI_API' OPEN_AI_API=<concealed by 1Password>
これは安心!